package org.Iter2.Dominio;


import java.sql.SQLException;
import java.util.Enumeration;
import java.util.Hashtable;

import org.Iter2.Persistencia.Agente;
import java.sql.ResultSet;

public class GestorUsuarios {
	private Hashtable<String,Usuario> tablaUsuarios;

	public GestorUsuarios() throws Exception {
		tablaUsuarios=new Hashtable<String,Usuario>();
		consultarUsuarios();
	}


	public Hashtable<String,Usuario> getTablaUsuarios() {
		return tablaUsuarios;
	}
	
	public ResultSet consultarUsuarios() throws Exception{
		ResultSet rs = null;
		String sentencia = "SELECT * FROM usuarios";
		try {
			Agente a = Agente.getAgente();
			rs = a.consultar(sentencia);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		while(rs.next()){
			String id = rs.getString("id");
			String password= rs.getString("password");
			String nombre = rs.getString("nombre");
			String apellidos = rs.getString("apellidos");
			String tipo = rs.getString("tipo");
			
			Usuario user;
			if(tipo.equalsIgnoreCase("administrador"))
				user = new UsuarioConPrivilegios(id, password, nombre, apellidos, tipo);
			else
				user = new UsuarioSinPrivilegios(id, password, nombre, apellidos, tipo);
			tablaUsuarios.put(id, user);
		}
		return rs;
	}
	
	public boolean addUsuario(Usuario user) throws Exception{
		boolean resultado=true;
		
		String identificador = user.getId();
		String pass = user.getPassword();
		String name = user.getNombre();
		String ape = user.getApellidos();
		String type = user.getTipo(); 
		
		String sentencia = "INSERT INTO usuarios (id, password, nombre, apellidos, tipo) VALUES ('"+ identificador+ "','" +pass+ "','" +name+ "','" +ape+"','" +type+"')";
		if(tablaUsuarios.containsKey(user.getId())&&user.getId()==null){
			resultado=false;
		}else{
		 
		try {
			Agente a = Agente.getAgente();
			a.gestionar(sentencia);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		tablaUsuarios.put(user.getId(), user);
		}
		return resultado;
	} 
	
	public boolean modificarUsuario(String id,Usuario user) throws Exception{
		boolean modificarUsuario=false;
		
		String sentencia = "UPDATE usuarios SET id='"+user.getId()+"', password='"+user.getPassword()+"', "+
                "nombre='"+user.getNombre()+"', "+
                "apellidos='"+user.getApellidos()+"', "+
                "tipo='"+user.getTipo()+"' "+
                "WHERE id='"+id+"'";
		
	    tablaUsuarios.containsKey(user.getId());
	    if(esUltimoAdmin(id)&&user.getTipo().equalsIgnoreCase("administrador")||!esUltimoAdmin(id)){
	    	modificarUsuario=true;
	    	
	    }
	    if(id.equals(user.getId())){
	    	modificarUsuario=true;
	    }else{
	    	if(tablaUsuarios.containsKey(user.getId())&&(user.getId()==null))
	    		modificarUsuario=false;
	    }
	     
	    if(modificarUsuario){
	    	tablaUsuarios.remove(id);
		try {
			Agente a = Agente.getAgente();
			a.gestionar(sentencia);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
			tablaUsuarios.put(user.getId(), user);

		}
	    
		return modificarUsuario;
	}
	
	public boolean eliminarUsuario(String id) throws Exception{
		boolean eliminarUsuario=true;
		
		String sentencia="DELETE FROM usuarios WHERE ID='"+id+"'";
		
		if(!esUltimoAdmin(id)){
		try {
			Agente a = Agente.getAgente();
			a.gestionar(sentencia);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		tablaUsuarios.remove(id);
		}else{
			eliminarUsuario=false;
		}
		return eliminarUsuario;
	}

	public boolean esUltimoAdmin(String id)  throws Exception{
		boolean esUltimoAdmin=true;
		int contadorAdmin=0;
		
	    Enumeration<String> en = tablaUsuarios.keys();
	    while(en.hasMoreElements()){
	    	if((tablaUsuarios.get(en.nextElement()).getTipo()).equals("administrador")){
	    		contadorAdmin++;
	    	}
	    }
		
	    if((contadorAdmin>1)||!(tablaUsuarios.get(id).getTipo()).equalsIgnoreCase("administrador")){
	    	esUltimoAdmin=false;
	    }
		return esUltimoAdmin;
	}
	
}
